// 用户数据仓库
import { defineStore } from 'pinia'
// api
import { reqLogin, reqUserInfo, reqLogout } from '@/api/login/index'
// 引入数据类型
import type { ILoginFormData, ILoginResponseData } from '@/api/login/type'
import { IUserState } from '../types/user'
// 引入全局变量
import { globals } from '@/main'
// 引入静态路由
import { constantRoute } from '@/router/routes'

// 创建用户数据仓库
let useUserStore = defineStore('User', {
  // 存储数据
  state: (): IUserState => {
    return {
      token: globals?.$localStorageInstance.getItem('token'),
      // 姓名
      name: '',
      // 头像
      avatar: '',
      // 菜单
      menus: constantRoute,
      // 角色
      roles: [],
    }
  },
  // 异步|逻辑
  actions: {
    // 用户登录的方法
    async userLogin(loginForm: ILoginFormData) {
      let { code, data, message }: ILoginResponseData =
        await reqLogin(loginForm)
      if (code == 200) {
        // 登录成功
        // 存储token
        this.token = data as string
        globals?.$localStorageInstance.setItem('token', data as string)
        return message
      } else {
        return Promise.reject(data || '登录失败')
      }
    },
    // 获取用户信息
    async userInfo() {
      const { code, data } = await reqUserInfo()
      // 存储用户信息
      if (code === 200) {
        const { name, avatar, roles } = data
        this.name = name
        this.avatar = avatar
        this.roles = roles
      }
    },
    // 清除用户信息
    async userLogout() {
      // 退出登录
      const { code, message } = await reqLogout()
      if (code === 200) {
        // 清除用户信息
        this.token = ''
        this.name = ''
        this.avatar = ''
        globals?.$localStorageInstance.removeItem('token')
        return Promise.resolve(message)
      } else {
        return Promise.reject(new Error(message))
      }
    },
  },
  // 计算属性
  getters: {},
})

// 对外暴露
export default useUserStore
